﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Xml.Linq;
using Microsoft.SharePoint;
using System.Text.RegularExpressions;

namespace LizardSoft.Common.FlexibleStructureDeployment
{
    public static partial class StructureHelper
    {
        private static void DeleteNeededContentTypes(SPWeb web, ListProcessingInfo listProcessingInfo)
        {
            SPList list = GetSPListFromFolderUrl(web, listProcessingInfo.ListFolderUrl);
            List<SPContentTypeId> listContentTypeIdsToBeDeleted = new List<SPContentTypeId>();
            foreach (SPContentType listContentType in list.ContentTypes)
            {
                if (!listProcessingInfo.SiteContentTypeIds.Contains(listContentType.Parent.Id))
                {
                    // тип конnента присутствует в списке, но его нет в массиве listInfo.SiteContentTypeIds
                    listContentTypeIdsToBeDeleted.Add(listContentType.Id);
                }
            }
            SPContentTypeCollection listContentTypes = list.ContentTypes;
            foreach (SPContentTypeId toBeDeletedId in listContentTypeIdsToBeDeleted)
            {
                if (!SPBuiltInContentTypeId.Contains(toBeDeletedId.Parent))
                {
                    // для кастомного типа контента необходимо сперва удалить поля из него, 
                    // чтобы они не остались в списке после удаления типа контента
                    DeleteAllFields(web, listProcessingInfo.ListFolderUrl, toBeDeletedId);
                }

                SPContentType listContentType = listContentTypes[toBeDeletedId];
                try
                {
                    listContentTypes.Delete(toBeDeletedId);
                }
                catch (Exception ex)
                {
                    // тип конента может быть в использовании и его нельзя будет удалить
                    string message = String.Format(
                        "Ошибка удаления типа конента {0} из списка {1}: {2}",
                        listContentType.Name,
                        list.Title,
                        ex.Message);
                    throw new Exception(message, ex);
                }
            }
        }
    }
}
